/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Maestros.Controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import net.sf.oval.ConstraintViolation;
import net.sf.oval.Validator;
import pe.edu.pucp.Maestros.DAO.AeropuertoDAO;
import pe.edu.pucp.Maestros.Vista.AeropuertoGUI;
import pe.edu.pucp.Modelo.Aeropuerto;
import pe.edu.pucp.Modelo.Ciudad;
import pe.edu.pucp.Modelo.Continente;
import pe.edu.pucp.Modelo.EstadoAeropuerto;
import pe.edu.pucp.Modelo.Pais;
import pe.edu.pucp.Modelo.Usuario;
import pe.edu.pucp.Util.Constante;
import pe.edu.pucp.Util.LogHelper;
import pe.edu.pucp.Util.Utilitario;
import pe.edu.pucp.Util.ValHelper;
import pe.edu.pucp.Util.Validacion.AeropuertoVal;

/**
 *
 * @author katy
 */
public class AeropuertoControlador {
    private AeropuertoDAO dao;
    private AeropuertoGUI view ;
    private ArrayList<Ciudad> lstCiudades ;
    private ArrayList<EstadoAeropuerto> lstEstadosAeropuerto ;
    private Aeropuerto aeropuerto;
    private ArrayList<Pais> lstPaises;
    private ArrayList<Continente> lstContinentes;
    private Validator validador;
    private Usuario usr;
    private int trans;
    
    public AeropuertoControlador(AeropuertoDAO dao, AeropuertoGUI aview, Usuario user){
        this.dao = dao;
        this.view = aview;
        this.validador = new Validator();
        this.usr = user;
        view.setDefaultValues();
        trans = Constante.TRANSACCION_REGISTRO;
        
        view.addCancelButtonListener(new CancelarAccionListener());
        view.addSaveButtonListener(new GuardarAeropuertoListener());
        view.addCambiarContinente(new CambiarLstPaisListener());
        view.addCambiarPais(new CambiarLstCiudadListener());  
        view.setEstadoGuardar("Guardar Aeropuerto");
        loadCombos(this.aeropuerto);
        addValidators();
    }
    
     public AeropuertoControlador(AeropuertoDAO dao, AeropuertoGUI aview, Aeropuerto a, Usuario user){
        this.dao = dao;
        view = aview;
        validador = new Validator();
        aeropuerto = a;
        usr = user;
        loadCombos(this.aeropuerto);
        trans = Constante.TRANSACCION_MODIFICACION;
        
        view.addCancelButtonListener(new CancelarAccionListener());
        view.addSaveButtonListener(new GuardarAeropuertoListener());
        view.addCambiarContinente(new CambiarLstPaisListener());
        view.addCambiarPais(new CambiarLstCiudadListener());  
        view.setEstadoGuardar("Editar Aeropuerto");        
        view.setValues(aeropuerto, lstContinentes, lstPaises, lstCiudades);
    
        addValidators();
    }
     
    private void addValidators() {
        view.soloTextoListener(new SoloTextoValidador());
        view.addSoloNumerosListener(new SoloNumerosValidador());
        view.addSoloNumerosYPunto(new SoloNumerosYPuntos());
    }
    
    public Aeropuerto getAeropuerto(AeropuertoVal a) {
        if (aeropuerto == null) {
            aeropuerto = new Aeropuerto();
            aeropuerto.setFechareg(new Date());
            aeropuerto.setCiudad(lstCiudades.get(view.getCiudad()));
            aeropuerto.setNumpack(0);
        }
        aeropuerto.setEstadoAeropuerto(lstEstadosAeropuerto.get(view.getEstadoAeropuerto()));
        aeropuerto.setCappack(a.getCappack());
        aeropuerto.setCostpack(a.getCostpack());
        aeropuerto.setCostoaeropuerto(a.getCostoaeropuerto());
        aeropuerto.setDescripcion(a.getDescripcion());
        aeropuerto.setTretencion(a.getTretencion());
        aeropuerto.setCostoaeropuerto(a.getCostoaeropuerto());
        return aeropuerto;
    }
    
    public void guardarAeropuerto(Aeropuerto a) {
        try {
            boolean b = dao.guardarAeropuerto(a);
            if (trans == Constante.TRANSACCION_REGISTRO) { LogHelper.registrarOperacion(usr, Constante.ACTIVIDAD_REGISTRAR, Constante.OBJETO_AEROPUERTO, "Se registró el aeropuerto con código "+a.getIdaeropuerto()); }
            if (trans == Constante.TRANSACCION_MODIFICACION) { LogHelper.registrarOperacion(usr, Constante.ACTIVIDAD_MODIFICAR, Constante.OBJETO_AEROPUERTO, "Se modificó el aeropuerto con código "+a.getIdaeropuerto()); }
            if (b) {
                ValHelper.mostrarAviso("Registro exitoso");
                view.dispose();
            }        
            else { 
                ValHelper.mostrarError("Ya existe un aeropuerto en esta ciudad.");
            }
        } catch (Exception ex) { 
            ValHelper.mostrarError("Ocurrió un error:" + ex.getMessage());
        }
    }   
  
    
    private void loadCombos(Aeropuerto a) {
        llenarEstados(a);
        llenarContinenteCombo();
        llenarPaisCombo(lstContinentes.get(view.getContinente()));
        llenarCiudadCombo(lstPaises.get(view.getPais()));
    }
    
    private void llenarContinenteCombo(){
        lstContinentes = dao.listarContinente();
        view.llenarComboContinente(lstContinentes);
    }

    private void llenarPaisCombo(Continente cont){
        lstPaises= dao.listarPais(cont.getIdcontinente());
        view.llenarComboPais(lstPaises);
    } 
    
    public void llenarCiudadCombo(Pais p){ 
         lstCiudades = dao.listarCiudad(p.getIdpais());
        view.llenaCiudades(lstCiudades);
    }
    
    public void llenarEstados(Aeropuerto a){
        lstEstadosAeropuerto = dao.listarEstadosAeropuerto();
        view.llenaEstadosEditables(lstEstadosAeropuerto, a);
    }
    
    class CambiarLstPaisListener implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {
            if (e.getStateChange()== ItemEvent.SELECTED){
                llenarPaisCombo(lstContinentes.get(view.getContinente()));
            }
        }        
    }  
    
    class CambiarLstCiudadListener implements ItemListener{
        @Override
        public void itemStateChanged(ItemEvent e) {            
            if (e.getStateChange()== ItemEvent.SELECTED){
                llenarCiudadCombo(lstPaises.get(view.getPais()));
            }
        }        
    } 
    class GuardarAeropuertoListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {        
            AeropuertoVal aVal = new AeropuertoVal();
            aVal.setDescripcion(view.getDescripcion());
            aVal.setCappack(view.getCapacidadAlmacen());
            aVal.setCostoaeropuerto(view.getCostoLlegada());
            aVal.setCostpack(view.getCostoAlmacenamiento());
            aVal.setTretencion(view.getTiempoRetencion());
            
            List<ConstraintViolation> violations = validador.validate(aVal);
            if(violations.size()>0){
                ValHelper.mostrarError(Utilitario.parsearMensajeError(violations.get(0).getMessage()));
            }
            else {
                Aeropuerto a = getAeropuerto(aVal);
                guardarAeropuerto(a);            
            }
        }
    }

    class CancelarAccionListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            view.dispose();
        }
        
    }
    
    class SoloTextoValidador extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigitoTexto(e);
        }    
    }
    
    class SoloNumerosYPuntos extends KeyAdapter {
        @Override
        public void keyTyped(KeyEvent e) {
           ValHelper.soloDigito(e);
        }   
    }
    
    class SoloNumerosValidador extends KeyAdapter {       
        @Override
        public void keyTyped(KeyEvent e) {
            ValHelper.soloDigito(e);
        }
    }
}
